package com.zouxw.utils.json.model;

import javax.swing.tree.DefaultMutableTreeNode;

/**
 * JSON节点模型类
 * 扩展DefaultMutableTreeNode，添加JSON特定的属性和方法
 * 
 * @author zouxw
 * @version 1.0
 */
public class JsonNode extends DefaultMutableTreeNode {
    
    private static final long serialVersionUID = 1L;
    
    // ==================== 节点类型常量 ====================
    /** 对象类型 */
    public static final String VALUE_TYPE_OBJECT = "OBJECT";
    
    /** 数组类型 */
    public static final String VALUE_TYPE_ARRAY = "ARRAY";
    
    /** 字符串类型 */
    public static final String VALUE_TYPE_STRING = "STRING";
    
    /** 数字类型 */
    public static final String VALUE_TYPE_NUMBER = "NUMBER";
    
    /** 布尔类型 */
    public static final String VALUE_TYPE_BOOLEAN = "BOOLEAN";
    
    /** null类型 */
    public static final String VALUE_TYPE_NULL = "NULL";
    
    /** 嵌套JSON类型 */
    public static final String VALUE_TYPE_NESTED_JSON = "NESTED_JSON";
    
    /** 未知类型 */
    public static final String VALUE_TYPE_UNKNOWN = "UNKNOWN";
    
    // ==================== 实例变量 ====================
    /** JSON原始值 */
    private Object jsonValue;
    
    /** 值类型 */
    private final String valueType;
    
    /** 是否高亮显示 */
    private boolean highlighted = false;
    
    /** 节点键名（用于对象属性） */
    private String key;
    
    /** 节点索引（用于数组元素） */
    private Integer index;
    
    // ==================== 构造函数 ====================
    
    /**
     * 构造函数
     * 
     * @param text 显示文本
     * @param jsonValue JSON原始值
     * @param valueType 值类型
     */
    public JsonNode(String text, Object jsonValue, String valueType) {
        super(text);
        this.jsonValue = jsonValue;
        this.valueType = valueType;
        this.key = null;
        this.index = null;
    }
    
    /**
     * 构造函数（带键名）
     * 
     * @param text 显示文本
     * @param jsonValue JSON原始值
     * @param valueType 值类型
     * @param key 键名
     */
    public JsonNode(String text, Object jsonValue, String valueType, String key) {
        super(text);
        this.jsonValue = jsonValue;
        this.valueType = valueType;
        this.key = key;
        this.index = null;
    }
    
    /**
     * 构造函数（带索引）
     * 
     * @param text 显示文本
     * @param jsonValue JSON原始值
     * @param valueType 值类型
     * @param index 索引
     */
    public JsonNode(String text, Object jsonValue, String valueType, Integer index) {
        super(text);
        this.jsonValue = jsonValue;
        this.valueType = valueType;
        this.key = null;
        this.index = index;
    }
    
    // ==================== Getter和Setter方法 ====================
    
    /**
     * 获取JSON原始值
     * 
     * @return JSON原始值
     */
    public Object getJsonValue() {
        return jsonValue;
    }
    
    /**
     * 设置JSON原始值
     * 
     * @param jsonValue JSON原始值
     */
    public void setJsonValue(Object jsonValue) {
        this.jsonValue = jsonValue;
    }
    
    /**
     * 获取值类型
     * 
     * @return 值类型
     */
    public String getValueType() {
        return valueType;
    }
    
    /**
     * 是否高亮显示
     * 
     * @return 是否高亮
     */
    public boolean isHighlighted() {
        return highlighted;
    }
    
    /**
     * 设置高亮状态
     * 
     * @param highlighted 是否高亮
     */
    public void setHighlighted(boolean highlighted) {
        this.highlighted = highlighted;
    }
    
    /**
     * 获取键名
     * 
     * @return 键名
     */
    public String getKey() {
        return key;
    }
    
    /**
     * 设置键名
     * 
     * @param key 键名
     */
    public void setKey(String key) {
        this.key = key;
    }
    
    /**
     * 获取索引
     * 
     * @return 索引
     */
    public Integer getIndex() {
        return index;
    }
    
    /**
     * 设置索引
     * 
     * @param index 索引
     */
    public void setIndex(Integer index) {
        this.index = index;
    }
    
    // ==================== 业务方法 ====================
    
    /**
     * 判断是否为对象类型
     * 
     * @return 是否为对象类型
     */
    public boolean isObject() {
        return VALUE_TYPE_OBJECT.equals(valueType);
    }
    
    /**
     * 判断是否为数组类型
     * 
     * @return 是否为数组类型
     */
    public boolean isArray() {
        return VALUE_TYPE_ARRAY.equals(valueType);
    }
    
    /**
     * 判断是否为基本类型（非对象、非数组）
     * 
     * @return 是否为基本类型
     */
    public boolean isPrimitive() {
        return !isObject() && !isArray();
    }
    
    /**
     * 判断是否为可编辑类型
     * 
     * @return 是否为可编辑类型
     */
    public boolean isEditable() {
        return VALUE_TYPE_STRING.equals(valueType) ||
               VALUE_TYPE_NUMBER.equals(valueType) ||
               VALUE_TYPE_BOOLEAN.equals(valueType) ||
               VALUE_TYPE_NESTED_JSON.equals(valueType);
    }
    
    /**
     * 判断是否为根节点
     * 
     * @return 是否为根节点
     */
    public boolean isRoot() {
        return "JSON Root".equals(getUserObject());
    }
    
    /**
     * 获取节点的唯一标识符
     * 
     * @return 唯一标识符
     */
    public String getUniqueIdentifier() {
        if (key != null) {
            return "key:" + key;
        } else if (index != null) {
            return "index:" + index;
        } else {
            return "value:" + String.valueOf(jsonValue).hashCode();
        }
    }
    
    /**
     * 获取节点的路径字符串
     * 
     * @return 路径字符串
     */
    public String getPathString() {
        StringBuilder path = new StringBuilder();
        JsonNode current = this;
        
        while (current != null && !current.isRoot()) {
            if (current.getKey() != null) {
                path.insert(0, "." + current.getKey());
            } else if (current.getIndex() != null) {
                path.insert(0, "[" + current.getIndex() + "]");
            }
            current = (JsonNode) current.getParent();
        }
        
        if (path.length() > 0 && path.charAt(0) == '.') {
            path.deleteCharAt(0);
        }
        
        return path.toString();
    }
    
    /**
     * 克隆节点（浅拷贝）
     * 
     * @return 克隆的节点
     */
    @Override
    public JsonNode clone() {
        JsonNode cloned = new JsonNode(
            (String) getUserObject(),
            jsonValue,
            valueType,
            key
        );
        cloned.setIndex(index);
        cloned.setHighlighted(highlighted);
        return cloned;
    }
    
    @Override
    public String toString() {
        return (String) getUserObject();
    }
    
    /**
     * 获取调试信息
     * 
     * @return 调试信息字符串
     */
    public String toDebugString() {
        return "JsonNode{" +
                "text='" + getUserObject() + '\'' +
                ", valueType='" + valueType + '\'' +
                ", key='" + key + '\'' +
                ", index=" + index +
                ", highlighted=" + highlighted +
                '}';
    }
}
